#ifndef MEMORY_H
#define MEMORY_H

#include <stddef.h>
#include <pthread.h>
#include <stdbool.h>

/* 内存池数据结构 */

/* 内存块结构 */
typedef struct MemoryBlock {
    void* data;                 // 数据指针
    size_t size;                // 块大小
    bool used;                  // 是否已使用
    struct MemoryBlock* next;   // 下一个块
} MemoryBlock;

// 内存池结构
typedef struct MemoryPool {
    void* pool_start;           // 池起始地址
    size_t pool_size;           // 池总大小
    size_t used_size;           // 已使用大小
    size_t block_size;          // 块大小
    int block_count;            // 块数量
    MemoryBlock* blocks;        // 块链表
    pthread_mutex_t lock;       // 线程安全锁
} MemoryPool;

/* 核心接口函数 */

// 初始化内存池 
MemoryPool* memory_pool_init(size_t pool_size, size_t block_size);

// 销毁内存池 
void memory_pool_destroy(MemoryPool* pool);

// 从内存池分配内存 
void* memory_pool_alloc(MemoryPool* pool, size_t size);

// 释放内存到内存池 
void memory_pool_free(MemoryPool* pool, void* ptr);

// 重置内存池（释放所有已分配的内存） 
void memory_pool_reset(MemoryPool* pool);

/* 统计和调试函数 */

// 获取内存池使用情况 
void memory_pool_get_stats(MemoryPool* pool, size_t* used_size, 
                          size_t* total_size, double* usage_rate);

// 打印内存池信息 
void memory_pool_print_info(MemoryPool* pool, const char* name);

// 检查内存池是否包含指定指针 
bool memory_pool_contains(MemoryPool* pool, void* ptr);

/* 工具函数 */

// 计算对齐后的内存大小 
size_t memory_align_size(size_t size, size_t alignment);

// 获取系统内存信息 
void memory_get_system_info(size_t* total_memory, size_t* available_memory);

#endif // MEMORY_H 